package algo3c3g3.model.action;

import org.jdom.Element;

import algo3c3g3.model.*;

/**
 * La unidad se mueve inmediatamente una cierta cantidad de bloques hacia adelante
 * teniendo en cuenta su direccion. Si el bloque es solido o no existe la unidad no se mueve.
 */
public class Teleporter extends Action
{
    private static final int XINCREMENT = 20;
    private static final int TRIGGER_STEP_COUNT = 5;
    private int stepCounter;
    
    public void perform(Unit unit)
    {
        stepCounter++;
        
        if(stepCounter == TRIGGER_STEP_COUNT)
        {
            teleport(unit);
        
            // Despues de mover a la unidad vuelve a ser Walker.
            unit.setAction(new Walker());
        }
    }
    
    @Override
    public Element save()
    {
        Element root = super.save();
        root.addContent(new Element("stepCounter").setText(Integer.toString(this.stepCounter)));
        return root;
        
    }

    @Override
    public void load(Element e)
    {
        this.stepCounter =
        	Integer.parseInt(e.getChildText("stepCounter"));
    }
    
    private void teleport(Unit unit)
    {
        // La posicion destino es la posicion de la unidad incrementada sobre el eje x.
        Coord destination = new Coord(unit.getXPosition() + (XINCREMENT * unit.getDirection()),
                            unit.getYPosition());
        
        /* Para poder mover a la unidad al bloque destino, este debe existir en el mapa
         * (posicion valida) y no debe ser solido. */
        if(unit.getOwnerMap().blockExists(destination))
            if(unit.getOwnerMap().blockAt(destination).isSolid() == false)
                unit.setPosition(destination);
    }
    
    
    
    
    public static void main(String[] args)
    {
        System.out.println();
        
        World world = new World(new Coord(2, 5), null, new TestMaps.TestTeleporterMap());
        
        System.out.println("Mapa:");
        world.printMap();
        
        world.addUnit();
        
        Unit unit1 = world.getUnit(0);
        
        System.out.println("\nNueva unidad:");
        unit1.printStatus();
        
        
        System.out.println("\nTeletransportandose:");
        unit1.setAction(new Teleporter());
        unit1.printStatus();
        world.moveUnits();
        System.out.println("\nDespues de teletransportarse:");
        unit1.printStatus();
        
        System.out.println("\nTeletransportandose de nuevo:");
        unit1.setAction(new Teleporter());
        unit1.printStatus();
        world.moveUnits();
        System.out.println("\nDespues de teletransportarse:");
        unit1.printStatus();
        
        System.out.println("\nCaminando:");
        for(int i = 0; i < 8; i++)
            world.moveUnits();
        
        unit1.printStatus();
        
        System.out.println("\nTeletransportandose hacia la izquierda:");
        unit1.setAction(new Teleporter());
        unit1.printStatus();
        world.moveUnits();
        System.out.println("\nDespues de teletransportarse:");
        unit1.printStatus();
        
        System.out.println();
    }
}
